home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #27 (Dec 87) / Basic Coins / MacTutor Coins.BAS < prev   
BASIC Source File  |  1987-10-21  |  7KB  |  330 lines

  1. 'Professor Mac's Coin Game
  2. 'By Dave Kelly
  3. ' ©MacTutor, DEC.1987
  4. ' For ZBasic™ version 4.0
  5.  
  6. WINDOW OFF
  7. COORDINATE WINDOW
  8. DEF MOUSE=-1
  9. False=0:True=NOT False
  10. DIM Qrect%(3),Drect%(3),Nrect%(3),Prect%(3),Displayrect%(3)
  11. DIM 63 A$(4)
  12. Mousy=0:'Set up point record
  13. Mousx=0:'for mouse location
  14. WINDOW 1,"",(2,22)-(510,335),4
  15. CALL SETRECT(Qrect(0),388,0,510,80)
  16. CALL SETRECT(Drect(0),388,81,510,140)
  17. CALL SETRECT(Nrect(0),388,141,510,215)
  18. CALL SETRECT(Prect(0),388,216,510,310)
  19. CALL SETRECT(Displayrect(0),0,140,385,250)
  20. BUTTON 1,0,"Add Coins",(300,80)-(375,100),2
  21. BUTTON 2,0,"Subtract",(300,110)-(375,130),2
  22. APPLE MENU "About Professor Mac's Coins…"
  23. MENU 1,0,1,"File"
  24. MENU 1,1,1,"New Amount/N"
  25. MENU 1,2,1,"Quit/Q"
  26. EDIT MENU 2
  27. Amount!=0
  28. GOSUB "Get Coin Resources"
  29. GOSUB "Draw Page"
  30. ON MENU GOSUB "MenuEvent"
  31. ON DIALOG GOSUB "DialogEvent"
  32. ON MOUSE GOSUB "MouseEvent"
  33. MENU ON:DIALOG ON:MOUSE ON
  34. DO
  35. UNTIL TheEnd
  36. MENU OFF:DIALOG OFF:MOUSE OFF
  37. END
  38.  
  39. "MenuEvent"
  40. Menunumber=MENU(0)
  41. Menuitem=MENU(1)
  42. MENU
  43. SELECT Menunumber
  44.     CASE 255
  45.         GOSUB "AppleMenu"
  46.         GOSUB "Display Amount"
  47.         GOSUB "Draw Page"
  48.     CASE 1
  49.         GOSUB "FileMenu"
  50.     CASE 2
  51. END SELECT
  52. RETURN
  53.  
  54. "AppleMenu"
  55. WINDOW 2,"",(100,40)-(415,310),-2
  56. TEXT 0,12
  57. PRINT @(5,1)"Professor Mac's Coin Game"
  58. PRINT @(10,2)"by"
  59. PRINT @(8,3)"Dave Kelly"
  60. PRINT @(7,4)"©MacTutor, 1987"
  61. PRINT @(7,5)"ZBasic version 4.0"
  62. PRINT @(3,8)"Professor Mac's MacTutor Store will"
  63. PRINT @(3,9)"display prices on the price tag."
  64. PRINT @(3,10)"The object is to select (by clicking)"
  65. PRINT @(3,11)"the fewest number of coins to equal"
  66. PRINT @(3,12)"the price. Hopefully this may be of"
  67. PRINT @(3,13)"assistance to children first learning"
  68. PRINT @(3,14)"about money."
  69. DO
  70. CALL GETMOUSE(Mousy)
  71. outsiderect=(Mousx<0 OR Mousx>300 OR Mousy<0 OR Mousy>270)
  72. UNTIL FN BUTTON AND NOT (outsiderect)
  73. WINDOW CLOSE 2
  74. RETURN
  75.  
  76. "FileMenu"
  77. SELECT Menuitem
  78.     CASE 1
  79.         GOSUB "New"
  80.     CASE 2
  81.         GOSUB "Quit"
  82. END SELECT
  83. RETURN
  84.  
  85. "Quit"
  86. 'Release all resource handles
  87. CALL RELEASERESOURCE(QHndl&)
  88. CALL RELEASERESOURCE(DHndl&)
  89. CALL RELEASERESOURCE(NHndl&)
  90. CALL RELEASERESOURCE(PHndl&)
  91. CALL RELEASERESOURCE(THndl&)
  92. CALL RELEASERESOURCE(MHndl&)
  93. END
  94.  
  95. "New"
  96. RANDOMIZE TIMER
  97. Amount!=RND(100)*.01
  98. Add=True
  99. NumOfQ%=0
  100. NumOfD%=0
  101. NumOfN%=0
  102. NumOfP%=0
  103. Total!=0
  104. GOSUB "Display Amount"
  105. GOSUB "Display Total"
  106. GOSUB "Draw Display"
  107. BUTTON 1,2
  108. BUTTON 2,1
  109. RETURN
  110.  
  111. "DialogEvent"
  112. Dilg=DIALOG(0)
  113. SELECT Dilg
  114.     CASE 5
  115.         RefWin=DIALOG(5):'Get window to refresh
  116.         WINDOW 1
  117.         GOSUB "Display Amount":GOSUB "Draw Page"
  118.     CASE 1
  119.         Buttonpressed=DIALOG(1)
  120.         BUTTON Buttonpressed,2
  121.         LONG IF Buttonpressed=1
  122.             BUTTON 2,1
  123.             Add=True
  124.         XELSE
  125.             BUTTON 1,1
  126.             Add=False
  127.         END IF
  128. END SELECT
  129. RETURN
  130.  
  131. "Display Amount"
  132.     TEXT 3,24,1,0
  133.     PICTURE (60,50),THndl&
  134.     CALL MOVETO (130,100)
  135.     PRINT USING "$#.##";Amount!;SPC(2)
  136. RETURN
  137.  
  138. "Display Total"
  139.     TEXT 2,12,1,0
  140.     CALL MOVETO(5,285)
  141.     PRINT NumOfQ;" Quarters, ";NumOfD;" Dimes, ";NumOfN;" Nickels, ";NumOfP;" Pennies"
  142.     CALL MOVETO(5,300)
  143.     PRINT "Total:";USING "$#.##";Total!
  144.     'Check for winner
  145.     IF Total!=Amount! AND Total!<>0 THEN GOSUB "WinDialog"
  146. RETURN
  147.  
  148. "WinDialog"
  149. Temp!=Amount!
  150. CorrectNumOfQ%=Temp!/.25
  151. Temp!=Temp!-CorrectNumOfQ%*.25
  152. CorrectNumOfD%=Temp!/.1
  153. Temp!=Temp!-CorrectNumOfD%*.1
  154. CorrectNumOfN%=Temp!/.05
  155. Temp!=Temp!-CorrectNumOfN%*.05
  156. CorrectNumOfP%=Temp!*100
  157. LONG IF NumOfQ%=CorrectNumOfQ% AND NumOfD%=CorrectNumOfD% AND NumOfN%=CorrectNumOfN% AND NumOfP%=CorrectNumOfP%
  158.     A$(1)="TA-DA!  You Did it!"
  159.     A$(2)="Select 'New Amount' to start again"
  160.     A$(3)=""
  161.     A$(4)=""
  162.     CALL PARAMTEXT(A$(1),A$(2),A$(3),A$(4))
  163.     Response%=FN ALERT(1,0)
  164. XELSE
  165.     A$(1)="Nice Try!"
  166.     A$(2)="You have too many coins!"
  167.     A$(3)="You should have: "+STR$(CorrectNumOfQ%)+" Quarters, "+STR$(CorrectNumOfD%)+" Dimes,"
  168.     A$(4)=STR$(CorrectNumOfN%)+" Nickels, "+STR$(CorrectNumOfP%)+" Pennies"
  169.     CALL PARAMTEXT(A$(1),A$(2),A$(3),A$(4))
  170.     Response%=FN ALERT(1,0)
  171. END IF
  172. Amount!=0
  173. BUTTON 1,0
  174. BUTTON 2,0
  175. RETURN
  176.  
  177. "TooMuchDialog"
  178.     A$(1)="Adding that coin will give you "+USING "$#.##";Total!
  179.     A$(2)="Try a different coin!"
  180.     A$(3)=" "
  181.     A$(4)=" "
  182.     CALL PARAMTEXT(A$(1),A$(2),A$(3),A$(4))
  183.     Response%=FN ALERT(1,0)
  184. RETURN
  185.  
  186. "No More Coins"
  187.     A$(1)="Sorry, You don't have any more "+Coin$
  188.     A$(2)=" "
  189.     A$(3)=" "
  190.     A$(4)=" "
  191.     CALL PARAMTEXT(A$(1),A$(2),A$(3),A$(4))
  192.     Response%=FN ALERT(1,0)
  193. RETURN
  194.  
  195. "Get Coin Resources"
  196.     QHndl&=FN GETNAMEDRESOURCE(CVI("PICT"),"Quarter")
  197.     CALL LOADRESOURCE(QHndl&)
  198.     DHndl&=FN GETNAMEDRESOURCE(CVI("PICT"),"Dime")
  199.     CALL LOADRESOURCE(DHndl&)
  200.     NHndl&=FN GETNAMEDRESOURCE(CVI("PICT"),"Nickel")
  201.     CALL LOADRESOURCE(NHndl&)
  202.     PHndl&=FN GETNAMEDRESOURCE(CVI("PICT"),"Penny")
  203.     CALL LOADRESOURCE(PHndl&)
  204.     THndl&=FN GETNAMEDRESOURCE(CVI("PICT"),"Tag")
  205.     CALL LOADRESOURCE(THndl&)
  206.     MHndl&=FN GETNAMEDRESOURCE(CVI("PICT"),"Professor Mac")
  207.     CALL LOADRESOURCE(MHndl&)
  208. RETURN
  209.  
  210. "Draw Page"
  211.     PICTURE (400,0),QHndl&
  212.     PICTURE (406,78),DHndl&
  213.     PICTURE (400,138),NHndl&
  214.     PICTURE (406,220),PHndl&
  215.     CALL MOVETO(385,0)
  216.     CALL PENSIZE(2,2)
  217.     CALL LINETO(385,340)
  218.     CALL MOVETO(0,135)
  219.     CALL LINETO(385,135)
  220.     CALL PENNORMAL
  221.     PICTURE (0,0),MHndl&
  222.     CALL MOVETO(60,40)
  223.     TEXT 2,18,0,0
  224.     PRINT "Professor Mac's Coin Game"
  225. "Draw Display"
  226.     CALL ERASERECT(Displayrect(0))
  227.     IF NumOfQ>0 THEN PICTURE (0,140),QHndl&
  228.     IF NumOfD>0 THEN PICTURE (100,140),DHndl&
  229.     IF NumOfN>0 THEN PICTURE (200,140),NHndl&
  230.     IF NumOfP>0 THEN PICTURE (300,140),PHndl&
  231. RETURN
  232.  
  233. "MouseEvent"
  234. IF Amount!=0 THEN FLUSHEVENTS:RETURN
  235. CALL GETMOUSE(Mousy)
  236. LONG IF (FN PTINRECT(Mousy,Qrect%(0)))
  237.     LONG IF Add=True
  238.         Total!=Total!+.25
  239.         NumOfQ=NumOfQ+1
  240.         GOSUB "Draw Display"
  241.     XELSE
  242.         LONG IF NumOfQ-1<0
  243.             Coin$="Quarters!"
  244.             GOSUB "No More Coins"
  245.         XELSE
  246.             NumOfQ=NumOfQ-1
  247.             Total!=Total!-.25
  248.             IF Total!<0 THEN Total!=Total!+.25
  249.             GOSUB "Draw Display"
  250.         END IF
  251.     END IF
  252.     LONG IF Total!>Amount! 
  253.         GOSUB "TooMuchDialog"
  254.         Total!=Total!-.25
  255.         NumOfQ=NumOfQ-1
  256.     END IF
  257.     GOSUB "Display Total"
  258. END IF
  259. LONG IF FN PTINRECT(Mousy,Drect(0))
  260.     LONG IF Add=True
  261.         Total!=Total!+.1
  262.         NumOfD=NumOfD+1
  263.         GOSUB "Draw Display"
  264.     XELSE
  265.         LONG IF NumOfD-1<0
  266.             Coin$="Dimes!"
  267.             GOSUB "No More Coins"
  268.         XELSE
  269.             NumOfD=NumOfD-1
  270.             Total!=Total!-.1
  271.             IF Total!<0 THEN Total!=Total!+.1
  272.             GOSUB "Draw Display"
  273.         END IF
  274.     END IF
  275.     LONG IF Total!>Amount! 
  276.         GOSUB "TooMuchDialog"
  277.         Total!=Total!-.1
  278.         NumOfD=NumOfD-1
  279.     END IF
  280.     GOSUB "Display Total"
  281. END IF
  282. LONG IF FN PTINRECT(Mousy,Nrect(0))
  283.     LONG IF Add=True
  284.         Total!=Total!+.05
  285.         NumOfN=NumOfN+1
  286.         GOSUB "Draw Display"
  287.     XELSE
  288.         LONG IF NumOfN-1<0
  289.             Coin$="Nickels!"
  290.             GOSUB "No More Coins"
  291.         XELSE
  292.             NumOfN=NumOfN-1
  293.             Total!=Total!-.05
  294.             IF Total!<0 THEN Total!=Total!+.05
  295.             GOSUB "Draw Display"
  296.         END IF
  297.     END IF
  298.     LONG IF Total!>Amount! 
  299.         GOSUB "TooMuchDialog"
  300.         Total!=Total!-.05
  301.         NumOfN=NumOfN-1
  302.     END IF
  303.     GOSUB "Display Total"
  304. END IF
  305. LONG IF FN PTINRECT(Mousy,Prect(0))
  306.     LONG IF Add=True
  307.         Total!=Total!+.01
  308.         NumOfP=NumOfP+1
  309.         GOSUB "Draw Display"
  310.     XELSE
  311.         LONG IF NumOfP-1<0
  312.             Coin$="Pennies!"
  313.             GOSUB "No More Coins"
  314.         XELSE
  315.             NumOfP=NumOfP-1
  316.             Total!=Total!-.01
  317.             IF Total!<0 THEN Total!=Total!+.01
  318.             GOSUB "Draw Display"
  319.         END IF
  320.     END IF
  321.     LONG IF Total!>Amount! 
  322.         GOSUB "TooMuchDialog"
  323.         Total!=Total!-.01
  324.         NumOfP=NumOfP-1
  325.     END IF
  326.     GOSUB "Display Total"
  327. END IF
  328. DO:UNTIL NOT (FN BUTTON)
  329. FLUSHEVENTS
  330. RETURN